package models;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import controllers.CRUD.Hidden;

import play.data.validation.MaxSize;
import play.data.validation.Required;
import play.db.jpa.Model;
import utils.DateHelper;

@Entity
public class Evento extends Model{

	public String nombre;
	
	@ManyToOne
	public TipoEvento tipoEvento;

	@ManyToOne
	public Periodicidad periodicidad;

	@ManyToOne
	public Organizacion cliente;
	
	//determina si arcadia es contratada para conseguir auspiciantes para el evento
	public boolean auspiciante;
	
	//determina si arcadia es contratada para organizar el evento
	public boolean orquestar;
	
	//representa los datos de la coordinacion y organizacion del evento. Cuando orquestar es true.	
	@OneToOne
	public Orquesta orquesta;
		
	@ManyToOne
	public Localidad localidad;
	
	public String domicilio;
	
	public String hora;
	
	public Date fecha;
		
	
	@MaxSize(1000)
	public String observaciones;

	@Hidden
	@OneToOne
	public ArcadiaLog lastLogs;
	
	@ManyToMany
	public List<ArcadianoNivel> arcadianos;

	@ManyToOne
	public SubBase auspiciantes;
	
	@OneToMany
	public List<Invitacion> invitaciones;
	
	public String getActualizado(){
		if (lastLogs!=null)
			return DateHelper.getFechaHora(lastLogs.fecha).concat(" - ").concat(lastLogs.user.username);
		else 
			return "";
	}
	
	@Override
	public String toString() {	
		if (nombre==null || "".equals(nombre))
			return "Sin Nombre";
		return nombre;
	}
	
	public void asociarArcadiano(ArcadianoNivel arcadiano){
		if (arcadianos==null)
			arcadianos = new ArrayList<ArcadianoNivel>();
		arcadianos.add(arcadiano);
	}
	
	public void addInvitacion(Invitacion invitacion){
		if (invitaciones==null)
			invitaciones = new ArrayList<Invitacion>();
		invitaciones.add(invitacion);
	}
	
	public ArcadianoNivel getArcadiano(Long id){
		if (arcadianos!=null)
			for (ArcadianoNivel arcadiano: arcadianos){
				if (arcadiano.arcadiano.id.equals(id))
					return arcadiano;
			}
		return null;
	}
	
	public void removeArcadiano(ArcadianoNivel arcadiano){
		if (arcadianos!=null)
			arcadianos.remove(arcadiano);
	}
	
	public void removeInvitacion(Invitacion invitacion){
		if (invitaciones!=null)
			invitaciones.remove(invitacion);
	}

	public boolean containsInvitacion(Organizacion organizacion){
		for (Invitacion invitacion: invitaciones){
			if (organizacion.id.equals(invitacion.organizacion.id))
				return true;
		}
		return false;
	}
	
	public String arcadianos(){
		String arc = "";
		if (arcadianos!=null){
			for (ArcadianoNivel arcadiano: orderArcadianoNivel(arcadianos)){
				arc = arc.concat(", ");
				arc = arc.concat(arcadiano.arcadiano.nombre);
			}
			arc = arc.replaceFirst(",", "");
		}
		return arc;
	}
	
	private static List<ArcadianoNivel> orderArcadianoNivel(List<ArcadianoNivel> arcadianos) {
		Collections.sort(arcadianos, new Comparator() {

			public int compare(Object o1, Object o2) {
				ArcadianoNivel e1 = (ArcadianoNivel) o1;
				ArcadianoNivel e2 = (ArcadianoNivel) o2;
				return Integer.valueOf(e1.level).compareTo(Integer.valueOf(e2.level));
			}
		});
		return arcadianos;
	}
	
	
}
